package gepes.dao;

import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.imageio.ImageIO;

import gepes.exepcion.DAOExcepcion;
import gepes.modelo.TipoDocumento;
import gepes.modelo.TipoUsuario;
import gepes.modelo.Usuario;
import gepes.util.Conexion;

public class UsuarioDAO extends Base {

	public void anular(int id, boolean estado, String usuario) throws DAOExcepcion {
		String query = "update usuario set estado=? "
				+ (!estado ? " , fechaanul=now(), usuarioanul=?" : "")
				+ "WHERE codusuario=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = Conexion.ConectarDB();
			stmt = con.prepareStatement(query);
			if (estado) {
				stmt.setInt(1, (estado ? 1 : 0));
				stmt.setInt(2, id);
			} else {
				stmt.setInt(1, (estado ? 1 : 0));
				stmt.setString(2, usuario);
				stmt.setInt(3, id);
			}
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo "
						+ (estado ? "Activar" : "Anular"));
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}

	public int existe(String dato, String campo) throws DAOExcepcion {
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "select count(0) from usuario where "
					+ campo + "=?";			
			con = Conexion.ConectarDB();
			stmt = con.prepareStatement(query);
			stmt.setString(1, dato);
			rs = stmt.executeQuery();
			if (rs.next()) {
				return rs.getInt(1);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return 0;
	}

	public Usuario obtener(int idUsuario) throws DAOExcepcion {
		Usuario vo = new Usuario();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "select u.codUsuario,u.codtipousuario,tu.descripcion,"
					+ "u.apepat,u.apemat,u.nombres,u.sexo,u.codtipodocumento, "
					+ "td.descripcion,u.nrodocumento,u.mail,u.nrocelular,"
					+ "u.perfil,u.foto,u.estado "
					+ "from usuario u inner join tipousuario tu on "
					+ "u.codtipousuario=tu.codtipousuario left join "
					+ "tipodocumento td on u.codtipodocumento=td.codtipodocumento "
					+ "where u.codUsuario=?";
			con = Conexion.ConectarDB();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, idUsuario);
			rs = stmt.executeQuery();
			if (rs.next()) {
				vo.setCodUsuario(rs.getInt(1));
				vo.setTipoUsuario(new TipoUsuario(rs.getInt(2),
						rs.getString(3), true));
				vo.setApePat(rs.getString(4));
				vo.setApeMat(rs.getString(5));
				vo.setNombres(rs.getString(6));
				vo.setSexo(rs.getString(7));
				vo.setTipoDocumento(new TipoDocumento(rs.getInt(8), rs
						.getString(9), true));
				vo.setNroDocumento(rs.getString(10));
				vo.setMail(rs.getString(11));
				vo.setNroCelular(rs.getString(12));
				vo.setPerfil(rs.getString(13));
				
				Blob blob = rs.getBlob(14);
				byte[] data = blob.getBytes(1, (int)blob.length());
				BufferedImage img = null;
				try {
					img = ImageIO.read(new ByteArrayInputStream(data));
				} catch (IOException ex) {
					Logger.getLogger(UsuarioDAO.class.getName()).log(Level.SEVERE, null, ex);
				}
				vo.setFoto(img);	
				vo.setEstado(rs.getInt(15) == 1 ? true : false);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}

	
	public Collection<Usuario> listar(int idtipousuario) throws DAOExcepcion {
		Collection<Usuario> lista = new ArrayList<Usuario>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "select u.codUsuario,u.codtipousuario,tu.descripcion,"
					+ "u.apepat,u.apemat,u.nombres,"
					+ "u.mail,,"
					+ "u.estado "
					+ "from usuario u inner join tipousuario tu on "
					+ "u.codtipousuario=tu.codtipousuario left join "
					+ "tipodocumento td on u.codtipodocumento=td.codtipodocumento "
					+ "where codtipousuario=? order by u.codusuario";
			con = Conexion.ConectarDB();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, idtipousuario);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Usuario vo = new Usuario();
				vo.setCodUsuario(rs.getInt(1));
				vo.setTipoUsuario(new TipoUsuario(rs.getInt(2),
						rs.getString(3), true));
				vo.setApePat(rs.getString(4));
				vo.setApeMat(rs.getString(5));
				vo.setNombres(rs.getString(6));
				vo.setMail(rs.getString(7));
				vo.setEstado(rs.getInt(8) == 1 ? true : false);
				lista.add(vo);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return lista;
	}
}
